package com.mydemo.utils.dataUtils.addUtils;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.mydemo.utils.dataUtils.DataOperation;
import com.mydemo.utils.dataUtils.DataUtil;
import com.mydemo.utils.dataUtils.JsonAndFile.FileRW;
import com.mydemo.utils.dataUtils.entity;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import static com.mydemo.utils.dataUtils.JsonAndFile.Deserialize.deserialize;
import static com.mydemo.utils.dataUtils.JsonAndFile.Serialize.serialize;

public class Add<T> implements DataOperation<T> {
    private Class<T> clazz;
    private String table;
    public Add(Class<T> clazz, String table) {
        this.clazz = clazz;
        this.table = table;
    }
    @Override
    public T execute(){
//        return null;
        return (T) "add方法测试";
    }


    /**
     * 向存储在指定文件中的列表添加新的实例对象
     *
     * @param object 新添加的目标对象。
     */
    public <T> void add(
            Object object
    ) {


        String jsonRead = FileRW.FileRead(table);//先read到对应的JSON
        List<T> objectList = deserialize(jsonRead, (Class<T>) clazz);//将对应的JSON转换为arrayList
        // 检查objectList是否为null或空，如果是，则直接设置ID为1
        int id = 1;
        //从objectList中找到最大的ID
        if (objectList != null && !objectList.isEmpty()) {
            // 从objectList中找到最大的ID
            id = objectList.stream()
                    .mapToInt(item -> (Integer) getID(item, clazz))
                    .max()
                    .orElse(0) + 1;
        }// 从objectList中找到最大的ID
        setID(object, clazz, id);//为新对象设置ID
        if (clazz.isInstance(object)) {
            objectList.add((T) clazz.cast(object));
        } else {
            throw new IllegalArgumentException("对象格式有误！ " + clazz);
        }//检查对象是否是clazz的实例，然后添加到list中
        String newJSON = serialize(objectList);//序列化更新后的列表为JSON字符串
        FileRW.FileWrite(table, newJSON);//重新覆盖整个文件
    }

    // 此方法用于从给定的对象中获取ID属性的值。
//    private static Object getID(Object object, Class<?> clazz) {
//        if (object == null) {
//            return 0; // 返回int基本类型
//        }
//        if (object instanceof JSONObject) {
//            // 如果对象是JSONObject类型，通过get方法获取id
//            return ((JSONObject) object).getInteger("Id");
//        } else {
//            // 如果是实体类类型，使用反射获取id
//            try {
//                Field idField = clazz.getDeclaredField("Id");
//                idField.setAccessible(true);
////                System.out.println("测试断点" + idField.getInt(object));
//                return idField.getInt(object);
//            } catch (Exception e) {
////                return 0;
//                throw new RuntimeException("无法获取ID值", e);
//            }
//        }
//    }
    private static Object getID(Object object, Class<?> clazz) {
        if (object == null) {
            return 0;
        }
        if (object instanceof JSONObject) {
            return ((JSONObject) object).getInteger("Id");
        } else {
            // 尝试在entity类中查找Id字段
            Class<?> superClass = clazz;
            while (superClass != null) {
                try {
                    Field idField = superClass.getDeclaredField("Id");
                    idField.setAccessible(true);
                    return idField.getInt(object);
                } catch (NoSuchFieldException | IllegalAccessException ignored) {
                    // 如果在当前类中没有找到，继续查找父类
                    superClass = superClass.getSuperclass();
                }
            }
            throw new RuntimeException("无法获取ID值");
        }
    }





    // 此方法用于设置给定对象的ID属性。
//    private static void setID(Object object, Class<?> clazz, int id) { // 改为int
//        if (object instanceof JSONObject) {
//            // 如果对象是JSONObject类型，通过put方法设置id
//            ((JSONObject) object).put("Id", id);
//        } else {
//            // 如果是实体类类型，使用反射设置id
//            try {
//                Field idField = clazz.getDeclaredField("Id");
//                idField.setAccessible(true);
//                idField.setInt(object, id); // 改为int
//            } catch (Exception e) {
//                throw new RuntimeException("无法设置ID值", e);
//            }
//        }
//    }

    private static void setID(Object object, Class<?> clazz, int id) {
        if (object instanceof entity) {
            ((entity) object).setId(id);
        } else if (object instanceof JSONObject) {
            // 如果对象是JSONObject类型，通过put方法设置id
            ((JSONObject) object).put("Id", id);
        } else {
            throw new RuntimeException("无法设置ID值");
        }
    }
}
